<?php
class CierresController extends AppController {
    var $name = 'Cierres';
    var $appModule = 'Seguridad';
    var $helpers = array('Html', 'Form', 'Javascript', 'Paginator', 'Codigo', 'Time', 'Number', 'GetList');
    var $uses = array('Cierre', 'Modulo', 'Ejercicio', 'Periodo', 'ExcepcionesCierre', 'Aro', 'Usuario', 'Grupo');

    function index(){
        $conditions = array(
            'Cierre.empresa_id'=>$this->_usuario['Tercero']['empresa_id'],
        );
        $q = $this->getBusqueda($this->data['Cierre']['busqueda']);
        //ejecutando query
        $this->Cierre->Behaviors->attach('Containable');
        $this->paginate['Cierre'] = array(
            'limit'=>$this->limite,
            'order'=>array('Cierre.ejercicio_id desc','Cierre.periodo_id desc','Cierre.dia desc'),
            'fields'=>array(
                'id',
                'empresa_id',
                'centro_dist_id',
                'modulo_id',
                'ejercicio_id',
                'periodo_id',
                'dia',
                'usuario_creacion_id',
                'fecha_creacion',
                "cast((cast(\"Cierre\".dia as varchar(2))||'/'||\"Periodo\".codigo||'/'||\"Ejercicio\".codigo) as DATE) as \"Cierre__fecha\"",
//                "cast( \"Cierre\".dia as varchar(2)) || '/' || \"Periodo\".codigo || '/' || \"Ejercicio\".codigo as fecha"
            ),
            'conditions'=>$conditions,
            'contain' => array(
                'CentroDist.descripcion_corta',
                'Modulo.descripcion',
                'Ejercicio.codigo',
                'Periodo.codigo'
            )
        );
        $cierres = $this->paginate('Cierre');

        //estableciendo valores para vista
        if(!empty($this->params['url']['limite'])){
                $this->limite = $this->params['url']['limite'];
        }
        $this->data['Cierre']['pagesize'] = $this->paginate['limite'] = $this->limite;        
        $this->set('q',$q);
        $this->set('cierres',$cierres);
        $this->set('limite',$this->limite);
    }

    function add(){
        if (!empty($this->data)){
            $ejercicio = $this->Ejercicio->read(null, $this->data['Cierre']['ejercicio_id']);
            $periodo = $this->Periodo->read(null, $this->data['Cierre']['periodo_id']);
            if (empty($this->data['Cierre']['dia']) && $this->data['Cierre']['periodo_id']==0){
                $anual = true;
                $mensual = false;
                $diario = false;
            } else if (empty($this->data['Cierre']['dia'])){
                $anual = false;
                $mensual = true;
                $diario = false;
            } else {
                $anual = false;
                $mensual = false;
                $diario = true;
            }
            $this->Cierre->begin();
            $follow = true;
            set_time_limit(0);

            $this->data['Cierre']['empresa_id'] = $this->_usuario['Tercero']['empresa_id'];
//            $this->data['Cierre']['centro_dist_id'] = $this->_usuario['Tercero']['centro_dist_id'];
            $this->data['Cierre']['usuario_creacion_id'] = $this->_usuario['id'];
            $this->data['Cierre']['fecha_creacion'] = 'now()';
            $follow = $this->Cierre->save($this->data);
            if ($follow){
                switch($this->data['Cierre']['modulo_id']){
                    case 1: // facturacion                        
                        $this->Cierre->cierreFacturacion(
                                $this->_usuario['Tercero']['empresa_id'],
                                $this->_usuario['Tercero']['centro_dist_id'],
                                $this->_usuario,
                                $ejercicio['Ejercicio']['codigo'],
                                !$anual ? $periodo['Periodo']['codigo'] : null,
                                $diario ? $this->data['Cierre']['dia'] : null
                        );
                        break;
                    case 2: // cuentas corrientes                       
                        $this->Cierre->cierreCuentaCorriente(
                                $this->_usuario['Tercero']['empresa_id'],
                                $this->_usuario['Tercero']['centro_dist_id'],
                                $this->_usuario,
                                $ejercicio['Ejercicio']['codigo'],
                                !$anual ? $periodo['Periodo']['codigo'] : null,
                                $diario ? $this->data['Cierre']['dia'] : null
                        );
                        break;
                    case 3: // almacen
                        $this->Cierre->cierreAlmacen(
                                $this->_usuario['Tercero']['empresa_id'],
                                $this->_usuario['Tercero']['centro_dist_id'],
                                $this->_usuario,
                                $ejercicio['Ejercicio']['codigo'],
                                !$anual ? $periodo['Periodo']['codigo'] : null,
                                $diario ? $this->data['Cierre']['dia'] : null
                        );
                        break;
                    case 4: // compras
                        break;
                    case 5: // transporte
                        break;
                    case 6: // produccion
                        $this->Cierre->cierreProduccion(
                                $this->_usuario['Tercero']['empresa_id'],
                                $this->_usuario['Tercero']['centro_dist_id'],
                                $this->_usuario,
                                $ejercicio['Ejercicio']['codigo'],
                                !$anual ? $periodo['Periodo']['codigo'] : null,
                                $diario ? $this->data['Cierre']['dia'] : null
                        );
                        break;
                    case 7: // contabilidad
                        break;
                    case 8: // tesoreria
                        break;
                    case 9: // personal
                        break;
                    case 10: // administracion
                        break;
                }
            }

            if ($follow){
                $this->Cierre->commit();
                $this->Session->setFlash('El cierre se ha generado correctamente');
                $this->redirect(array('action'=>'index'));
            } else {
                $this->Cierre->rollback();
                $this->Session->setFlash('Se ha producido un error al generar el cierre');
            }
        }
        $this->set('_ejercicio', $this->_ejercicio);
        $this->set('modulos', $this->Modulo->find('list', array(
            'fields'=>array('id', 'descripcion')
        )));
        $this->set('centroDists', $this->CentroDist->find('list', array(
            'fields'=>array('id', 'descripcion_corta'),
            'conditions'=>array(
                'empresa_id'=>$this->empresaId(),
                'activo'=>true
            ),
            'order'=>'codigo'
        )));
        $this->set('ejercicios', $this->Ejercicio->find('list', array(
            'fields'=>array('id', 'descripcion'),
            'conditions'=>array(
                'empresa_id'=>$this->empresaId(),
                'activo'=>true,
                'cerrado <>'=>true
            ),
            'order'=>'codigo'
        )));
        $this->set('periodos', $this->Periodo->find('list', array(
            'fields'=>array('id', 'descripcion'),
            'conditions'=>array(
                'activo'=>true
            ),
            'order'=>'codigo'
        )));
    }

    function apertura($id = null){
        if (empty($id)){
            $this->Session->setFlash('Identificador invalido');
            $this->redirect(array('action'=>'index'));
        }
        if (!empty($this->data)){
            if (array_key_exists('grabar', $this->params['form'])){ // grabar
                if (trim($this->data['ExcepcionesCierre']['fecha_inicial'])=='')
                        $this->data['ExcepcionesCierre']['fecha_inicial'] = null;
                if (trim($this->data['ExcepcionesCierre']['fecha_final'])=='')
                        $this->data['ExcepcionesCierre']['fecha_final'] = null;

                $this->data['ExcepcionesCierre']['usuario_creacion_id'] = $this->usuarioId();
                $this->data['ExcepcionesCierre']['fecha_creacion'] = 'now()';

                if ($this->ExcepcionesCierre->save($this->data)){
                    $this->Session->setFlash('La excepcion se ha adicionado correctamente');
                } else {
                    $this->Session->setFlash('Se ha producido un error al adicionar la excepcion');
                }
            } else { // eliminar
                foreach($this->data as $item){
                    if (!array_key_exists('id', $item)||$item['id']==0) continue;
                    $excepcion = $this->ExcepcionesCierre->read(null,$item['id']);
                    if (!$this->ExcepcionesCierre->remove($excepcion['ExcepcionesCierre'])){
                        $this->Session->setFlash('Se ha producido un error al eliminar las excepciones');
                        break;
                    }
                }
            }
        }

        $this->ExcepcionesCierre->Aro->bindModel(array(
            'belongsTo'=>array(
                'Grupo'=>array(
                    'className'=>'Grupo',
                    'foreignKey'=>'foreign_key'
                ),
                'Usuario'=>array(
                    'className'=>'Usuario',
                    'foreignKey'=>'foreign_key'
                ),
            )
        ));

        $this->ExcepcionesCierre->Aro->Behaviors->attach('Containable');
        $tmp = $this->ExcepcionesCierre->Aro->find('all',array(
            'fields'=>array('id','model','foreign_key','alias'),
            'order'=>array('Aro.id'),
            'contain'=>array(
                'Usuario'=>array(
                    'fields'=>array('id','grupo_id','usuario'),
                    'Grupo'=>array(
                        'fields'=>array('id','descripcion')
                    )
                ),
                'Grupo'=>array(
                    'fields'=>array('id','descripcion')
                )
            )
        ));
//        print_r($tmp);
        
        $this->Cierre->Behaviors->attach('Containable');
        $cierre = $this->Cierre->find('first',array(
            'fields'=>array('id','modulo_id','ejercicio_id','periodo_id','dia'),
            'conditions'=>array('Cierre.id'=>$id),
            'contain'=>array(
                'Modulo'=>array(
                    'fields'=>array('id','codigo','descripcion'),
                ),
                'Ejercicio'=>array(
                    'fields'=>array('id','codigo','descripcion'),
                )
            )
        ));

        $this->ExcepcionesCierre->Behaviors->attach('Containable');
        $excepciones = $this->ExcepcionesCierre->find('all',array(
            'fields'=>array('id','cierre_id','aro_id','fecha_inicial','fecha_final'),
            'conditions'=>array('cierre_id'=>$id),
            'order'=>array('ExcepcionesCierre.id'),
            'contain'=>array(
                'Aro'=>array(
                    'fields'=>array('id','model','foreign_key'),
                    'Usuario'=>array(
                        'fields'=>array('id','grupo_id','usuario'),
                        'Grupo'=>array(
                            'fields'=>array('id','descripcion'),
                        )
                    ),
                    'Grupo'=>array(
                        'fields'=>array('id','descripcion')
                    )
                )
            )
        ));

        $aros = array();
        foreach($tmp as $t){
            if ($t['Aro']['model'] == 'Usuario'){
                $aros += array($t['Aro']['id']=>(isset($t['Usuario']['Grupo']['descripcion'])?$t['Usuario']['Grupo']['descripcion'].'\\':'').$t['Usuario']['usuario']);
            } else if ($t['Aro']['model'] == 'Grupo'){
                $aros += array($t['Aro']['id']=>$t['Grupo']['descripcion']);
            }
        }

        $this->set('cierre',$cierre);
        $this->set('excepciones', $excepciones);
        $this->set('aros', $aros);
    }

    function cierreFacturacion(){ // cierre diario de facturacion y cuentas corrientes
        list($dia, $mes, $anyo) = explode('/',$this->_ejercicio['Actual']['fecha']);
        $cierre = array(
            'Cierre'=>array(
                'empresa_id'=>$this->_usuario['Tercero']['empresa_id'],
                'centro_dist_id'=>$this->_usuario['Tercero']['centro_dist_id'],
                'modulo_id'=>1, // facturacion
                'ejercicio_id'=>$this->_ejercicio['id'],
                'periodo_id'=>$this->_ejercicio['Actual']['periodo_id'],
                'dia'=>$dia,
            )
        );
        //
        $check = $this->Cierre->find('first',array(
            'conditions'=>$cierre['Cierre'],
            'recursive'=>-1
        ));
        if (isset($check['Cierre']['id']) && !empty($check['Cierre']['id'])){
            $this->Session->setFlash('El cierre ya existe');
            $this->redirect($this->indexUrl);
        }
        $cierre['Cierre']['usuario_creacion_id'] = $this->usuarioId();
        $cierre['Cierre']['fecha_creacion'] = 'now()';
        
        set_time_limit(0);
        $this->Cierre->begin();
        $follow = $this->Cierre->save($cierre);
        if ($follow){
            $follow = $this->Cierre->cierreFacturacion(
                    $this->_usuario['Tercero']['empresa_id'],
                    $this->_usuario['Tercero']['centro_dist_id'],
                    $this->_usuario,
                    $this->_ejercicio['codigo'],
                    $this->periodoId(),
                    $this->data['Cierre']['dia']
            );
        }

        if ($follow){
            $this->Cierre->commit();
            $this->Session->setFlash('El cierre se ha generado correctamente');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        } else {
            $this->Cierre->rollback();
            $this->Session->setFlash('Se ha producido un error al generar el cierre');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        }
    }

    function cierreCuentaCorriente(){ // cierre diario de facturacion y cuentas corrientes
        list($dia, $mes, $anyo) = explode('/',$this->_ejercicio['Actual']['fecha']);
        $cierre = array(
            'Cierre'=>array(
                'empresa_id'=>$this->_usuario['Tercero']['empresa_id'],
                'centro_dist_id'=>$this->_usuario['Tercero']['centro_dist_id'],
                'modulo_id'=>2, // cuenta corriente
                'ejercicio_id'=>$this->_ejercicio['id'],
                'periodo_id'=>$this->_ejercicio['Actual']['periodo_id'],
                'dia'=>$dia
            )
        );
        // verificando si existe
        $check = $this->Cierre->find('first',array(
            'conditions'=>$cierre['Cierre'],
            'recursive'=>-1
        ));
        if (isset($check['Cierre']['id']) && !empty($check['Cierre']['id'])){
            $this->Session->setFlash('El cierre ya existe');
            $this->redirect($this->indexUrl);
        }
        $cierre['Cierre']['usuario_creacion_id'] = $this->usuarioId();
        $cierre['Cierre']['fecha_creacion'] = 'now()';

        set_time_limit(0);
        $this->Cierre->begin();
        $follow = $this->Cierre->save($cierre);
        if ($follow){
            $follow = $this->Cierre->cierreCuentaCorriente(
                    $this->_usuario['Tercero']['empresa_id'],
                    $this->_usuario['Tercero']['centro_dist_id'],
                    $this->_usuario,
                    $this->_ejercicio['codigo'],
                    $this->periodoId(),
                    $this->data['Cierre']['dia']
            );
        }

        if ($follow){
            $this->Cierre->commit();
            $this->Session->setFlash('El cierre se ha generado correctamente');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        } else {
            $this->Cierre->rollback();
            $this->Session->setFlash('Se ha producido un error al generar el cierre');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        }
    }

    function cierreAlmacen(){ // cierre diario de facturacion y cuentas corrientes
        list($dia, $mes, $anyo) = explode('/',$this->_ejercicio['Actual']['fecha']);
        $cierre = array(
            'Cierre'=>array(
                'empresa_id'=>$this->_usuario['Tercero']['empresa_id'],
                'centro_dist_id'=>$this->_usuario['Tercero']['centro_dist_id'],
                'modulo_id'=>1, // facturacion
                'ejercicio_id'=>$this->_ejercicio['id'],
                'periodo_id'=>$this->_ejercicio['Actual']['periodo_id'],
                'dia'=>$dia
            )
        );
        // verificando si existe
        $check = $this->Cierre->find('first',array(
            'conditions'=>$cierre['Cierre'],
            'recursive'=>-1
        ));
        if (isset($check['Cierre']['id']) && !empty($check['Cierre']['id'])){
            $this->Session->setFlash('El cierre ya existe');
            $this->redirect($this->indexUrl);
        }
        $cierre['Cierre']['usuario_creacion_id'] = $this->usuarioId();
        $cierre['Cierre']['fecha_creacion'] = 'now()';

        set_time_limit(0);
        $this->Cierre->begin();
        $follow = $this->Cierre->save($cierre);
        if ($follow){
            $follow = $this->Cierre->cierreAlmacen(
                    $this->_usuario['Tercero']['empresa_id'],
                    $this->_usuario['Tercero']['centro_dist_id'],
                    $this->_usuario,
                    $this->_ejercicio['codigo'],
                    $this->periodoId(),
                    $this->data['Cierre']['dia']
            );
        }

        set_time_limit(30);
        if ($follow){
            $this->Cierre->commit();
            $this->Session->setFlash('El cierre se ha generado correctamente');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        } else {
            $this->Cierre->rollback();
            $this->Session->setFlash('Se ha producido un error al generar el cierre');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        }
    }

    function cierreProduccion(){ // cierre diario de facturacion y cuentas corrientes
        list($dia, $mes, $anyo) = explode('/',$this->_ejercicio['Actual']['fecha']);
        $cierre = array(
            'Cierre'=>array(
                'empresa_id'=>$this->empresaId(),
                'centro_dist_id'=>$this->centroDistId(),
                'modulo_id'=>6, // produccion
                'ejercicio_id'=>$this->ejercicioId(),
                'periodo_id'=>$this->periodoId(),
                'dia'=>$dia
            )
        );
        // verificando si existe
        $check = $this->Cierre->find('first',array(
            'conditions'=>$cierre['Cierre'],
            'recursive'=>-1
        ));
        if (isset($check['Cierre']['id']) && !empty($check['Cierre']['id'])){
            $this->Session->setFlash('El cierre ya existe');
            $this->redirect($this->indexUrl);
        }
        $cierre['Cierre']['usuario_creacion_id'] = $this->usuarioId();
        $cierre['Cierre']['fecha_creacion'] = 'now()';

        set_time_limit(0);
        $this->Cierre->begin();
        $follow = $this->Cierre->save($cierre);
        if ($follow){
            $follow = $this->Cierre->cierreProduccion(
                    $this->empresaId(),
                    $this->_usuario['Tercero']['centro_dist_id'],
                    $this->_usuario,
                    $this->_ejercicio['codigo'],
                    $this->periodoId(),
                    $this->data['Cierre']['dia']
            );
        }

        if ($follow){
            $this->Cierre->commit();
            $this->Session->setFlash('El cierre se ha generado correctamente');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        } else {
            $this->Cierre->rollback();
            $this->Session->setFlash('Se ha producido un error al generar el cierre');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        }
    }

    function cierreCompras(){ // cierre diario de facturacion y cuentas corrientes
        list($dia, $mes, $anyo) = explode('/',$this->_ejercicio['Actual']['fecha']);
        $cierre = array(
            'Cierre'=>array(
                'empresa_id'=>$this->empresaId(),
                'centro_dist_id'=>$this->centroDistId(),
                'modulo_id'=>4, // compras
                'ejercicio_id'=>$this->ejercicioId(),
                'periodo_id'=>$this->periodoId(),
                'dia'=>$dia
            )
        );
        // verificando si existe
        $check = $this->Cierre->find('first',array(
            'conditions'=>$cierre['Cierre'],
            'recursive'=>-1
        ));
        if (isset($check['Cierre']['id']) && !empty($check['Cierre']['id'])){
            $this->Session->setFlash('El cierre ya existe');
            $this->redirect($this->indexUrl);
        }
        $cierre['Cierre']['usuario_creacion_id'] = $this->usuarioId();
        $cierre['Cierre']['fecha_creacion'] = 'now()';
        
        set_time_limit(0);
        $this->Cierre->begin();
        $follow = $this->Cierre->save($cierre);
        if ($follow){
            $follow = $this->Cierre->cierreCompras(
                    $this->empresaId(),
                    $this->_usuario['Tercero']['centro_dist_id'],
                    $this->_usuario,
                    $this->_ejercicio['codigo'],
                    $this->periodoId(),
                    $this->data['Cierre']['dia']
            );
        }

        set_time_limit(30);
        if ($follow){
            $this->Cierre->commit();
            $this->Session->setFlash('El cierre se ha generado correctamente');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        } else {
            $this->Cierre->rollback();
            $this->Session->setFlash('Se ha producido un error al generar el cierre');
            $this->redirect(array('controller'=>'Home','action'=>'index'));
        }
    }
}
?>
